package com.jwater.core.net.group;

import java.util.Map;

import com.jwater.core.net.NodeHandler;
import com.jwater.core.net.group.data.DurableDataItem;

/**
 * @description:
 * @author: jnner
 * @createDate: 2021/2/5
 * @version: 1.0
 */
public interface GroupNode {
    /**
     * 设置group处理器
     *
     * @param handler
     */
    public void setGroupHandler(GroupHandler handler);

    /**
     * 设置node处理器
     *
     * @param handler
     */
    public void setNodeHandler(NodeHandler handler);

    /**
     * 加入组
     *
     * @param memberId
     */
    public void joinGroup(int memberId);

    /**
     * 向组里发送数据
     *
     * @param dataType
     * @param data
     */
    public void sendDataToMembers(String dataType, byte[] data);

    /**
     * 同步调用
     *
     * @param method
     * @param data
     * @return
     */
    public Map<Integer, byte[]> callMembers(String method, byte[] data);

    /**
     * 分布式锁
     *
     * @param key
     */
    public void lock(String key);

    /**
     * 解锁
     *
     * @param key
     */
    public void unlock(String key);

    /**
     * 存储共享数据
     *
     * @param key
     * @param itemKey
     * @param data
     */
    public void storeDataItem(String key, String itemKey, DurableDataItem data);

    /**
     * 获取共享数据
     *
     * @param key
     * @param itemKey
     * @return
     */
    public DurableDataItem getDataItem(String key, String itemKey);

    /**
     * 移除共享数据
     *
     * @param key
     * @param itemKey
     */
    public void removeDataItem(String key, String itemKey);

    /**
     * 设置共享数据
     *
     * @param key
     * @param isDurable
     */
    public void setData(String key, boolean isDurable);

    /**
     * 根据前缀获取共享数据
     *
     * @param key
     * @param prefix
     * @return
     */
    public Map<String, DurableDataItem> getItemsByPrefix(String key, String prefix);

    /**
     * 获取共享数据
     *
     * @param key
     * @return
     */
    public Map<String, DurableDataItem> getItems(String key);

    /**
     * 是否是主控节点
     *
     * @return
     */
    public boolean isLeader();
}
